{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.10"
    },
    "colab": {
      "name": "15_Synthetic_Feasibility_Scoring.ipynb",
      "provenance": []
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LOooVC6OpbFs",
        "colab_type": "text"
      },
      "source": [
        "# Tutorial Part 15: Synthetic Feasibility\n",
        "\n",
        "Synthetic feasibility is a problem when running large scale enumerations.  Ofen molecules that are enumerated are very difficult to make and thus not worth inspection even if their other chemical properties are good in silico.  This tutorial goes through how to train the [ScScore](https://pubs.acs.org/doi/abs/10.1021/acs.jcim.7b00622) model [1].\n",
        "\n",
        "The idea of the model is to train on pairs of molecules where one molecule is \"more complex\" than the other.  The neural network then can make scores which attempt to keep this pairwise ordering of molecules.  The final result is a model which can give a relative complexity of a molecule.\n",
        "\n",
        "The paper trains on every reaction in reaxys, declaring products more complex than reactions.  Since this training set is prohibitively expensive we will instead train on arbitrary molecules declaring one more complex if it's SMILES string is longer.  In the real world you can use whatever measure of complexity makes sense for the project.\n",
        "\n",
        "In this tutorial, we'll use the Tox21 dataset to train our simple synthetic feasibility model.\n",
        "\n",
        "## Colab\n",
        "\n",
        "This tutorial and the rest in this sequence are designed to be done in Google colab. If you'd like to open this notebook in colab, you can use the following link.\n",
        "\n",
        "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/deepchem/deepchem/blob/master/examples/tutorials/15_Synthetic_Feasibility_Scoring.ipynb)\n",
        "\n",
        "\n",
        "## Setup\n",
        "\n",
        "We recommend you run this tutorial on Google colab. You'll need to run the following commands to set up your colab environment to run the notebook."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "IlFeRa3qpbFz",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 323
        },
        "outputId": "2836932a-eae7-487c-b20d-54607c452046"
      },
      "source": [
        "!curl -Lo conda_installer.py https://raw.githubusercontent.com/deepchem/deepchem/master/scripts/colab_install.py\n",
        "import conda_installer\n",
        "conda_installer.install()\n",
        "!/root/miniconda/bin/conda info -e"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n",
            "                                 Dload  Upload   Total   Spent    Left  Speed\n",
            "\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r100  3489  100  3489    0     0  11948      0 --:--:-- --:--:-- --:--:-- 11907\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "add /root/miniconda/lib/python3.6/site-packages to PYTHONPATH\n",
            "python version: 3.6.9\n",
            "fetching installer from https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\n",
            "done\n",
            "installing miniconda to /root/miniconda\n",
            "done\n",
            "installing rdkit, openmm, pdbfixer\n",
            "added conda-forge to channels\n",
            "added omnia to channels\n",
            "done\n",
            "conda packages installation finished!\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "# conda environments:\n",
            "#\n",
            "base                  *  /root/miniconda\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "pveyx31SFSp7",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 361
        },
        "outputId": "9ab163f3-3f4b-4a12-9494-cc41c730353c"
      },
      "source": [
        "!pip install --pre deepchem\n",
        "import deepchem\n",
        "deepchem.__version__"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Collecting deepchem\n",
            "\u001b[?25l  Downloading https://files.pythonhosted.org/packages/b5/d7/3ba15ec6f676ef4d93855d01e40cba75e231339e7d9ea403a2f53cabbab0/deepchem-2.4.0rc1.dev20200805054153.tar.gz (351kB)\n",
            "\r\u001b[K     |█                               | 10kB 24.2MB/s eta 0:00:01\r\u001b[K     |█▉                              | 20kB 3.0MB/s eta 0:00:01\r\u001b[K     |██▉                             | 30kB 3.7MB/s eta 0:00:01\r\u001b[K     |███▊                            | 40kB 4.0MB/s eta 0:00:01\r\u001b[K     |████▋                           | 51kB 3.5MB/s eta 0:00:01\r\u001b[K     |█████▋                          | 61kB 3.8MB/s eta 0:00:01\r\u001b[K     |██████▌                         | 71kB 4.3MB/s eta 0:00:01\r\u001b[K     |███████▌                        | 81kB 4.5MB/s eta 0:00:01\r\u001b[K     |████████▍                       | 92kB 4.6MB/s eta 0:00:01\r\u001b[K     |█████████▎                      | 102kB 4.7MB/s eta 0:00:01\r\u001b[K     |██████████▎                     | 112kB 4.7MB/s eta 0:00:01\r\u001b[K     |███████████▏                    | 122kB 4.7MB/s eta 0:00:01\r\u001b[K     |████████████▏                   | 133kB 4.7MB/s eta 0:00:01\r\u001b[K     |█████████████                   | 143kB 4.7MB/s eta 0:00:01\r\u001b[K     |██████████████                  | 153kB 4.7MB/s eta 0:00:01\r\u001b[K     |███████████████                 | 163kB 4.7MB/s eta 0:00:01\r\u001b[K     |███████████████▉                | 174kB 4.7MB/s eta 0:00:01\r\u001b[K     |████████████████▊               | 184kB 4.7MB/s eta 0:00:01\r\u001b[K     |█████████████████▊              | 194kB 4.7MB/s eta 0:00:01\r\u001b[K     |██████████████████▋             | 204kB 4.7MB/s eta 0:00:01\r\u001b[K     |███████████████████▋            | 215kB 4.7MB/s eta 0:00:01\r\u001b[K     |████████████████████▌           | 225kB 4.7MB/s eta 0:00:01\r\u001b[K     |█████████████████████▍          | 235kB 4.7MB/s eta 0:00:01\r\u001b[K     |██████████████████████▍         | 245kB 4.7MB/s eta 0:00:01\r\u001b[K     |███████████████████████▎        | 256kB 4.7MB/s eta 0:00:01\r\u001b[K     |████████████████████████▎       | 266kB 4.7MB/s eta 0:00:01\r\u001b[K     |█████████████████████████▏      | 276kB 4.7MB/s eta 0:00:01\r\u001b[K     |██████████████████████████      | 286kB 4.7MB/s eta 0:00:01\r\u001b[K     |███████████████████████████     | 296kB 4.7MB/s eta 0:00:01\r\u001b[K     |████████████████████████████    | 307kB 4.7MB/s eta 0:00:01\r\u001b[K     |█████████████████████████████   | 317kB 4.7MB/s eta 0:00:01\r\u001b[K     |█████████████████████████████▉  | 327kB 4.7MB/s eta 0:00:01\r\u001b[K     |██████████████████████████████▊ | 337kB 4.7MB/s eta 0:00:01\r\u001b[K     |███████████████████████████████▊| 348kB 4.7MB/s eta 0:00:01\r\u001b[K     |████████████████████████████████| 358kB 4.7MB/s \n",
            "\u001b[?25hRequirement already satisfied: joblib in /usr/local/lib/python3.6/dist-packages (from deepchem) (0.16.0)\n",
            "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from deepchem) (1.18.5)\n",
            "Requirement already satisfied: pandas in /usr/local/lib/python3.6/dist-packages (from deepchem) (1.0.5)\n",
            "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.6/dist-packages (from deepchem) (0.22.2.post1)\n",
            "Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from deepchem) (1.4.1)\n",
            "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas->deepchem) (2018.9)\n",
            "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas->deepchem) (2.8.1)\n",
            "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.6.1->pandas->deepchem) (1.15.0)\n",
            "Building wheels for collected packages: deepchem\n",
            "  Building wheel for deepchem (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "  Created wheel for deepchem: filename=deepchem-2.4.0rc1.dev20200805144657-cp36-none-any.whl size=438624 sha256=cbcfac6df825ca0d1f04e9343b677d876d7b822b02312f748878e9bb85826da7\n",
            "  Stored in directory: /root/.cache/pip/wheels/41/0f/fe/5f2659dc8e26624863654100f689d8f36cae7c872d2b310394\n",
            "Successfully built deepchem\n",
            "Installing collected packages: deepchem\n",
            "Successfully installed deepchem-2.4.0rc1.dev20200805144657\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            },
            "text/plain": [
              "'2.4.0-rc1.dev'"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 2
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "d3QTjXKwpbF9",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 88
        },
        "outputId": "94711095-67df-4616-89a1-47246f6629aa"
      },
      "source": [
        "# Lets get some molecules to play with\n",
        "\n",
        "from deepchem.molnet.load_function import tox21_datasets\n",
        "tasks, datasets, transformers = tox21_datasets.load_tox21(featurizer='Raw', split=None, reload=False)\n",
        "molecules = datasets[0].X"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "smiles_field is deprecated and will be removed in a future version of DeepChem. Use feature_field instead.\n",
            "/usr/local/lib/python3.6/dist-packages/deepchem/data/data_loader.py:198: FutureWarning: featurize() is deprecated and has been renamed to create_dataset(). featurize() will be removed in DeepChem 3.0\n",
            "  FutureWarning)\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Obts3nFSpbGC",
        "colab_type": "text"
      },
      "source": [
        "# Make The Datasets\n",
        "\n",
        "Because ScScore is trained on relative complexities we have our `X` tensor in our dataset has 3 dimensions `(sample_id, molecule_id, features)`.  the 1st dimension molecule_id is in \\[0, 1\\], because a sample is a pair of molecules.  The label is 1 if the zeroth molecule is more complex than the first molecule. The function `create_dataset` we introduce below pulls random pairs of smiles strings out of a given list and ranks them according to this complexity measure.\n",
        "\n",
        "In the real world you could use purchase cost, or number of reaction steps required as your complexity score. "
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "CN8YlS6YpbGD",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from rdkit import Chem\n",
        "import random\n",
        "from deepchem.feat import CircularFingerprint\n",
        "import deepchem as dc\n",
        "import numpy as np\n",
        "\n",
        "\n",
        "def create_dataset(fingerprints, smiles_lens, ds_size=100000):\n",
        "    \"\"\"\n",
        "    m1: list of np.Array\n",
        "        fingerprints for molecules\n",
        "    m2: list of int\n",
        "        length of a molecules SMILES string\n",
        "    \n",
        "    returns:\n",
        "        dc.data.Dataset for input into ScScore Model\n",
        "        \n",
        "    Dataset.X\n",
        "        shape is (sample_id, molecule_id, features)\n",
        "    Dataset.y\n",
        "        shape is (sample_id,)\n",
        "        values is 1 if the 0th index molecule is more complex\n",
        "                  0 if the 1st index molecule is more complex\n",
        "    \"\"\"\n",
        "    X, y = [], []\n",
        "    all_data = list(zip(fingerprints, smiles_lens))\n",
        "    while len(y) < ds_size:\n",
        "        i1 = random.randrange(0, len(smiles_lens))\n",
        "        i2 = random.randrange(0, len(smiles_lens))\n",
        "        m1 = all_data[i1]\n",
        "        m2 = all_data[i2]\n",
        "        if m1[1] == m2[1]:\n",
        "            continue\n",
        "        if m1[1] > m2[1]:\n",
        "            y.append(1.0)\n",
        "        else:\n",
        "            y.append(0.0)\n",
        "        X.append([m1[0], m2[0]])\n",
        "    return dc.data.NumpyDataset(np.array(X), np.expand_dims(np.array(y), axis=1))\n"
      ],
      "execution_count": 4,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Y57_UmtSpbGN",
        "colab_type": "text"
      },
      "source": [
        "With our complexity ranker in place we can now construct our dataset. Let's start by loading the molecules in the Tox21 dataset into memory. We split the dataset at this stage to ensure that the training and test set have non-overlapping sets of molecules."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "PAhEBQSKpbGP",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# Lets split our dataset into a train set and a test set\n",
        "molecule_ds = dc.data.NumpyDataset(np.array(molecules))\n",
        "splitter = dc.splits.RandomSplitter()\n",
        "train_mols, test_mols = splitter.train_test_split(molecule_ds)"
      ],
      "execution_count": 5,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oREWA_U2pbGW",
        "colab_type": "text"
      },
      "source": [
        "We'll featurize all our molecules with the ECFP fingerprint with chirality (matching the source paper), and will then construct our pairwise dataset using the code from above."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "r2M2fvvapbGY",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "# In the paper they used 1024 bit fingerprints with chirality\n",
        "n_features=1024\n",
        "featurizer = dc.feat.CircularFingerprint(size=n_features, radius=2, chiral=True)\n",
        "train_features = featurizer.featurize(train_mols.X)\n",
        "train_smileslen = [len(Chem.MolToSmiles(x)) for x in train_mols.X]\n",
        "train_dataset = create_dataset(train_features, train_smileslen)"
      ],
      "execution_count": 6,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5jL9qNebpbGc",
        "colab_type": "text"
      },
      "source": [
        "Now that we have our dataset created, let's train a `ScScoreModel` on this dataset."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "AZhS38JLpbGd",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "471f4813-1d0d-4e42-819a-f703e0c407a3"
      },
      "source": [
        "from deepchem.models import ScScoreModel\n",
        "# Now to create the model and train it\n",
        "model = ScScoreModel(n_features=n_features)\n",
        "model.fit(train_dataset, nb_epoch=20)"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "0.03990109920501709"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 7
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "nsBROH4WpbGi",
        "colab_type": "text"
      },
      "source": [
        "# Model Performance\n",
        "\n",
        "Lets evaluate how well the model does on our holdout molecules.  The SaScores should track the length of SMILES strings from never before seen molecules."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bIDZ3sZfpbGj",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline"
      ],
      "execution_count": 8,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hsJdJTZKpbGu",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "mol_scores = model.predict_mols(test_mols.X)\n",
        "smiles_lengths = [len(Chem.MolToSmiles(x)) for x in test_mols.X]"
      ],
      "execution_count": 9,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "J9n6wK8fpbG1",
        "colab_type": "text"
      },
      "source": [
        "Let's now plot the length of the smiles string of the molecule against the SaScore using matplotlib."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "CNgjQWQRpbG4",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 920
        },
        "outputId": "28938618-5e6a-4470-cfef-b0a75878843f"
      },
      "source": [
        "plt.figure(figsize=(20,16))\n",
        "plt.scatter(smiles_lengths, mol_scores)\n",
        "plt.xlim(0,80)\n",
        "plt.xlabel(\"SMILES length\")\n",
        "plt.ylabel(\"ScScore\")\n",
        "plt.show()"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 1440x1152 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "riCGU3D4pbG8",
        "colab_type": "text"
      },
      "source": [
        "As we can see the model generally tracks SMILES length.  It has good enrichment between 8 and 30 characters and gets both small and large SMILES strings extremes dead on.\n",
        "\n",
        "Now you can train your own models on more meaningful metrics than SMILES length!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eDugxI2PpbG-",
        "colab_type": "text"
      },
      "source": [
        "# Congratulations! Time to join the Community!\n",
        "\n",
        "Congratulations on completing this tutorial notebook! If you enjoyed working through the tutorial, and want to continue working with DeepChem, we encourage you to finish the rest of the tutorials in this series. You can also help the DeepChem community in the following ways:\n",
        "\n",
        "## Star DeepChem on [GitHub](https://github.com/deepchem/deepchem)\n",
        "This helps build awareness of the DeepChem project and the tools for open source drug discovery that we're trying to build.\n",
        "\n",
        "## Join the DeepChem Gitter\n",
        "The DeepChem [Gitter](https://gitter.im/deepchem/Lobby) hosts a number of scientists, developers, and enthusiasts interested in deep learning for the life sciences. Join the conversation!\n",
        "\n",
        "\n",
        "# Bibliography:\n",
        "\n",
        "[1] https://pubs.acs.org/doi/abs/10.1021/acs.jcim.7b00622"
      ]
    }
  ]
}